from django.utils import unittest
from calendario.models import Evento
from core.models import Grupo
from auth.models import User
import datetime
from django.db import IntegrityError
from django.test.client import Client

class EventoTestCase(unittest.TestCase):
    def setUp(self):
        
        #Configurar el Ambiente
        self.neto=User.objects.get(username="neto")
        self.douglas=User.objects.get(username="douglas")
        self.grupo1=Grupo.objects.create(nombre="grupo1", administrador=self.neto)
        self.grupo1.miembros.add(self.neto)
        self.grupo1.miembros.add(self.douglas)
        self.grupo1.save()
        self.grupo2=Grupo.objects.create(nombre="grupo2", administrador=self.douglas)
        self.grupo2.miembros.add(self.douglas)
        
        #Crear Eventos
        self.evento1=Evento.objects.create(nombre="Evento1",autor=self.neto,grupo_asociado=self.grupo1,descripcion="evento 1",lugar="uvg",fecha_de_inicio=datetime.date(2010,11,2))
        self.evento2=Evento.objects.create(nombre="Evento1",autor=self.douglas,grupo_asociado=self.grupo2,descripcion="evento 1",lugar="uvg",fecha_de_inicio=datetime.date(2010,11,15))
        self.evento3=Evento.objects.create(nombre='Evento2',autor=self.neto,grupo_asociado=self.grupo1,descripcion="evento 2",lugar="uvg",fecha_de_inicio.date(2010,11,9))
        
        #Crear Cliente
        self.cliente=Client()
        
    def test_evento_grupo(self):
        
        #Revisar los eventos de un grupo
        eventos=Evento.object.filter(grupo_asociado=self.grupo1).all()
        
        self.assertEqual(eventos.get(nombre=self.evento1.nombre),self.evento1)
        self.assertEqual(eventos.get(nombre=self.evento3.nombre),self.evento3)
        
        eventos=Evento.object.filter(grupo_asociado=self.grupo2).all()
        
        self.assertEqual(eventos.get(nombre=self.evento2.nombre),self.evento2)
        
    def test_evento_sort_by_fecha_de_inicio(self):
        
        eventos=Evento.objects.all().order_by('fecha_de_inicio')
        
        self.assertEqual(eventos[0],self.evento1)
        self.assertEqual(eventos[1],self.evento3)
        self.assertEqual(eventos[2],self.evento2)
        
    def test_campos_requeridos(self):
        
        #Probar que Descripcion sea opcional
        Evento.objects.create(nombre="Evento4", autor=self.neto, grupo_asociado=self.grupo1, lugar="uvg", fecha_de_inicio.date(2010,11,9))
        
        #Probar que la fecha de inicio sea requerida
        with self.assertRaises(IntegrityError):
            Evento.objects.create(nombre="Evento5", autor=self.neto, grupo_asociado=self.grupo1, lugar="uvg")
            
        #Probar que el lugar sea requerido
        with self.assertRaises(IntegrityError):
            Evento.objects.create(nombre="Evento6", autor=self.neto, grupo_asociado=self.grupo1, fecha_de_inicio.date(2010,11,9))
        
        #Probar que nombre sea requerido
        with self.assertRaises(IntegrityError):
            Evento.objects.create(lugar="uvg", autor=self.neto, grupo_asociado=self.grupo1, fecha_de_inicio.date(2010,11,9))
            
        #Probar que grupo_asociado sea requerido
        with self.assertRaises(IntegrityError):
            Evento.objects.create(nombre="Evento7", autor=self.neto, fecha_de_inicio.date(2010,11,9), lugar="uvg")
        
        #Revisar que autor sea requerido
        with self.assertRaises(IntegrityError):
            Evento.objects.create(nombre="Evento8", grupo_asociado=self.grupo1, fecha_de_inicio.date(2010,11,9), lugar="uvg")
            
    def provar_evento_vista(self):
        
        #Revisar que todas las vistar requieran que el usuario este registrado
        r=self.cliente.get('/calendario/eventos/1/')
        self.assertEqual(r.status_code,302)
        
        r=self.cliente.get('/calendario/eventos/1/editar')
        self.assertEqual(r.status_code,302)
        
        r=self.cliente.get('/calendario/eventos/crear_evento')
        self.assertEqual(r.status_code,302)
        
        #Revisar que haya una vista para Evento
        r=self.cliente.get('/calendario/eventos/1/')
        self.assertEqual(r.status_code,200)
        
        #Revisar que haya una vista para crear evento
        #r=self.cliente.post('/calendario/guardar_evento',{'nombre': 'Evento10', 'grupo_asociado': 'smith'})
        